@file:Suppress("UNUSED_PARAMETER", "unused")

package com.virtualightning.mvvm.impl.adapter

import android.os.Bundle
import com.virtualightning.mvvm.extensions.find
import com.virtualightning.mvvm.extensions.put
import com.virtualightning.mvvm.tools.SyncCode
import java.lang.ref.WeakReference

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/1/26 15:46:39
 *  Project : zxs-new
 *  适配器代理类
 */
abstract class AdapterProxy internal constructor(
    adapter: UniverseAdapter,
    // 当前同步码
    private val currentCode: Int,
    // 同步码工具
    private val syncCode: SyncCode,
    // 请求 Bundle
    val requestBundle: Bundle?,
    // 是否为预加载代理
    private val isPreload: Boolean = false
) {
    // 适配器弱引用
    private val adapterRef = WeakReference(adapter)
    // 用于保存数据的 Bundle
    private var savedBundle: Bundle? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:24
    // 执行列表初始化
    ///////////////////////////////////////////////////////////////////////////
    protected fun resetDataList(initDataList: List<Any>? = null, isOver: Boolean = false) {
        if(syncCode.checkCode(currentCode)) {
            adapterRef.get()?.resetDataList(initDataList, savedBundle, isPreload, isOver)
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:28
    // 追加数据列表
    ///////////////////////////////////////////////////////////////////////////
    protected fun appendList(dataList: List<Any>) {
        if(syncCode.checkCode(currentCode)) {
            adapterRef.get()?.appendList(dataList)
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:03
    // 执行加载完成
    ///////////////////////////////////////////////////////////////////////////
    protected fun loadCompleted() {
        if(syncCode.checkCode(currentCode)) {
            adapterRef.get()?.loadCompleted(savedBundle)
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:06
    // 执行加载失败
    ///////////////////////////////////////////////////////////////////////////
    protected fun loadError() {
        if(syncCode.checkCode(currentCode)) {
            adapterRef.get()?.loadError()
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:06
    // 加载完成并且没有更多数据了
    ///////////////////////////////////////////////////////////////////////////
    protected fun loadOver() {
        if(syncCode.checkCode(currentCode)) {
            adapterRef.get()?.loadOver()
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:37
    // 保存响应数据
    ///////////////////////////////////////////////////////////////////////////
    fun saveResponseParams(key: String, params: Any?) {
        if(syncCode.checkCode(currentCode)) {
            val tempBundle = savedBundle ?: Bundle()
            savedBundle = tempBundle
            tempBundle.put(key, params)
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:30
    // 找到请求数据
    ///////////////////////////////////////////////////////////////////////////
    inline fun<reified T> findRequestParams(key: String) : T? {
        return requestBundle.find(key)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:40
    // 找到请求数据，并预设缺省值
    ///////////////////////////////////////////////////////////////////////////
    inline fun <reified T> findRequestParamsByDefault(key: String, defaultVal: T) : T {
        return findRequestParams(key) ?: defaultVal
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/11/5 3:04 下午
    // 在同步块中执行方法
    ///////////////////////////////////////////////////////////////////////////
    fun runInSync(callback: () -> Unit) {
        if(syncCode.checkCode(currentCode)) {
            callback()
        }
    }
}


/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/2/3 14:09:39
 *  Project : zxs-new
 *  初始化适配器代理类
 */
class InitAdapterProxy(
    adapter: UniverseAdapter,
    currentCode: Int,
    syncCode: SyncCode,
    val isSilence: Boolean,
    requestBundle: Bundle?,
    isPreload: Boolean = false
) : AdapterProxy(adapter, currentCode, syncCode, requestBundle, isPreload) {

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:10
    // 初始化完成
    ///////////////////////////////////////////////////////////////////////////
    fun initCompleted(initDataList: List<Any>? = null, isOver: Boolean = false) {
        resetDataList(initDataList, isOver)
    }
}


/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/2/3 14:11:22
 *  Project : zxs-new
 *  预加载适配器代理类
 */
class PreloadAdapterProxy(
    adapter: UniverseAdapter,
    currentCode: Int,
    syncCode: SyncCode,
    requestBundle: Bundle?,
    isPreload: Boolean = false
) : AdapterProxy(adapter, currentCode, syncCode, requestBundle, isPreload) {

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:10
    // 初始化完成
    ///////////////////////////////////////////////////////////////////////////
    fun preloadCompleted(initDataList: List<Any>? = null, isOver: Boolean = false) {
        resetDataList(initDataList, isOver)
    }
}

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/2/3 14:11:22
 *  Project : zxs-new
 *  加载更多适配器代理类
 */
class LoadMoreAdapterProxy(
    adapter: UniverseAdapter,
    currentCode: Int,
    syncCode: SyncCode,
    requestBundle: Bundle?,
    isPreload: Boolean = false
) : AdapterProxy(adapter, currentCode, syncCode, requestBundle, isPreload) {

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:31
    // 向目前适配器中追加列表数据
    ///////////////////////////////////////////////////////////////////////////
    fun append(dataList: List<Any>) {
        appendList(dataList)
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:31
    // 加载完成没有更多了
    ///////////////////////////////////////////////////////////////////////////
    fun over() {
        loadOver()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:32
    // 加载完成表示本次加载结束，将会继续执行下一次下拉加载
    ///////////////////////////////////////////////////////////////////////////
    fun completed() {
        loadCompleted()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/3 下午2:31
    // 加载失败
    ///////////////////////////////////////////////////////////////////////////
    fun error() {
        loadError()
    }

}